﻿
#include "arch/arm64/ARM64Decoder.h"
#include "arch/arm64/Arm64.h"

#define TAG "ARM64Decoder"

std::unique_ptr<ARM64Decoder> decoder;

ARM64Decoder::ARM64Decoder()
{
    _pc = 0;
    generalReg = std::make_shared<GeneralRegisiter>();
    sysReg = std::make_shared<SystemRegisiter>();
    pstate = std::make_shared<PSTATE>();
}

/*
* ARM-V8指令集(aarch64)说明
* 1. 在AArch64状态下执行，在AArch32状态执行时兼容A32和T32
* 2. A64指令集中的指令操作码长度仍然是32位，而不是64位
* 3. 如果寄存器名称以X开头，则寄存器为64位。如果寄存器名称以W开头，则寄存器为32位。
* 4. AArch64异常处理：Interrupt（irq 和 fiq） Aborts（中止，指令获取失败（指令中止）或数据访问失败（数据中止）时）
*	Reset （复位被视为最高异常级别的特殊向量。）生成异常的指令（SVC HVC SMC）
* 5. 高速缓存是位于核心内存和主内存之间的小而快的内存块
*
* 6. 译码器解析（D0-D31）
*	6.1: D25-D28 进行指令分组op1
*/
int ARM64Decoder::decoder(uint32_t code)
{
    int op1 = GetBitMap(code, 25, 3);// ((code >> 25) & 0x0F);
    int ret = -1;
    LogZ("decoder pc cmd->" << std::hex << "pc:0x" << _pc << ",cmd:0x" << code);

    switch (op1)
    {
    case 4:
    case 6:
    case 12:
    case 14:
        LogZ("GROUP:Loads and Stores");
        ret = LoadAndStores(code);
        break;
    case 7:
    case 15:
        break;
    case 5:
    case 13:
        break;
    case 10:
    case 11:
        LogZ("GROUP:Branches, Exception Generating and System instructions");
        ret = GeneralSys(code);
        break;
    case 8:
    case 9:
        LogZ("GROUP:Data Processing -- Immediate");
        ret = DataProcessing(code);
        break;
    case 2:
        break;
    case 0:
        break;
    case 1:
    case 3:
        break;
    }
    LogZ("**************************************");
    if (ret == 0)
        return 0;
    Abort("get err pc code:" << std::hex << code << ":" << op1 << ":" << ret);
}

uint64_t ARM64Decoder::getPC()
{
    return _pc;
}

std::shared_ptr<GeneralRegisiter> ARM64Decoder::getGeneralRegisiter()
{
    return generalReg;
}

std::shared_ptr<SystemRegisiter> ARM64Decoder::getSystemRegisiter()
{
    return sysReg;
}

std::shared_ptr<PSTATE> ARM64Decoder::getPSTATE()
{
    return pstate;
}
